Graba FC
lResultado:= CrearObjetoFE_TicketAcceso()
If lResultado
	
	oFE:F1CabeceraCantReg:= 1
	oFE:F1CabeceraPtoVta:= OPC57   // Punto de venta
	
	do case
	case OPC56==11 ; oFE:F1CabeceraCbteTipo:= 1   //  factura A 
	case OPC56==21 ; oFE:F1CabeceraCbteTipo:= 2   //  Nota de Dbito A
	case OPC56==31 ; oFE:F1CabeceraCbteTipo:= 3   //  Nota de Crdito A
	case OPC56==12 ; oFE:F1CabeceraCbteTipo:= 6   //  Factura B
	case OPC56==22 ; oFE:F1CabeceraCbteTipo:= 7   //  Nota de Dbito B
	case OPC56==32 ; oFE:F1CabeceraCbteTipo:= 8   //  Nota de Crdito B
	endcase
		// 4	Recibos A	NULL
		// 5	Notas de Venta al contado A	NULL
		// 9	Recibos B	NULL
		// 10	Notas de Venta al contado B	NULL
		// 63	Liquidacion A	NULL
		// 64	Liquidacion B	NULL
		// 34	Cbtes. A del Anexo I, Apartado A,inc.f),R.G.Nro. 1415	NULL
		// 35	Cbtes. B del Anexo I,Apartado A,inc. f),R.G. Nro. 1415	NULL
		// 39	Otros comprobantes A que cumplan con R.G.Nro. 1415	NULL
		// 40	Otros comprobantes B que cumplan con R.G.Nro. 1415	NULL
		// 60	Cta de Vta y Liquido prod. A	NULL
		// 61	Cta de Vta y Liquido prod. B	NULL

	oFE:f1Indice = 0

	oFE:F1DetalleConcepto:= 1    // 1.Productos    2.Servicios   3.Productos y Servicios
	if OPC70==5
		oFE:F1DetalleDocTipo:= 96    //  DNI
		oFE:F1DetalleDocNro:= subst(OPC5,4,8)
	else
		oFE:F1DetalleDocTipo:= 80    //  CUIT
		oFE:F1DetalleDocNro:= subst(OPC5,1,2)+subst(OPC5,4,8)+subst(OPC5,13,1)
	endif

	oFE:F1DetalleCbteFch:= dtos(OPC1)
	oFE:F1DetalleCbteDesdeS:= str(OPC18X,8)
	oFE:F1DetalleCbteHastaS:= str(OPC18X,8)

	oFE:F1DetalleImpTotal:= round( OPC58 ,2)     		 // Total de comprobante   Sumar percepciones si las hubiera
	if (empty(OPC11+OPC12) .and. !empty(OPC58) )
		oFE:F1DetalleImpTotalConc:= round( OPC10 ,2)     // Neto no gravado
		oFE:F1DetalleImpNeto:= 0                         // Neto gravado
	else
		oFE:F1DetalleImpTotalConc:= 0                    // Neto no gravado
		oFE:F1DetalleImpNeto:= round( OPC10 ,2)          // Neto gravado
	endif
	oFE:F1DetalleImpOpEx:= 0                            // Neto exento   siempre 0 ???
	
	oFE:F1DetalleImpTrib:= round(OPC6 + OPC66 + OPC666 + OPC6666 ,2)  // Total de percepciones
	oFE:F1DetalleImpIva:= round(OPC11 + OPC12,2)    						// Total de IVA   OPC11I2 + OPC11I3 + OPC11I4 + OPC12
	
	//oFE:F1DetalleFchServDesde:= dtos(OPC1)          // Fecha desde del servicio dado  obligado si concepto es 2 o 3
	//oE:F1DetalleFchServHasta:= dtos(OPC1)          // Fecha hasta del servicio dado  obligado si concepto es 2 o 3
	//oFE:F1DetalleFchVtoPago:= dtos(OPC1)            // Fecha de vencimiento
	oFE:F1DetalleMonId:= "PES"                            // moneda
	oFE:F1DetalleMonCotiz:= 1                             // cotizacion moneda


	oFE:F1DetalleIvaItemCantidad:= lCNTIVA     //  Cantidad de ivas
	
	oFE:F1DetalleCbtesAsocItemCantidad:= 0
	oFE:F1DetalleOpcionalItemCantidad:= 0

	lTXTINFO:= " Solicita " + oFE:F1DetalleCbteFch +" Pto.Vta."+str(oFE:F1CabeceraPtoVta,4) + " N "+oFE:F1DetalleCbteDesdeS +CRLF
	lTXTINFO+= " Tipo Comprobante "+str(OPC56,2)+"  "+ddocx(OPC56)+"  "+str(oFE:F1CabeceraCbteTipo,2) +CRLF	 
	lTXTINFO+= " Tipo doc "+ str(oFE:F1DetalleDocTipo,2)+"    N "+oFE:F1DetalleDocNro +CRLF
	lTXTINFO+= " Total  "+str( oFE:F1DetalleImpTotal ,12,2 ) +CRLF
	lTXTINFO+= " Neto   "+str( oFE:F1DetalleImpNeto ,12,2 ) +CRLF
	lTXTINFO+= " Iva    "+str( oFE:F1DetalleImpIva ,12,2 )+"     Cantidad "+str(oFE:F1DetalleIvaItemCantidad,3) +CRLF
	lTXTINFO+= " Percep "+str( oFE:F1DetalleImpTrib ,12,2 )+"     Cantidad "+str(oFE:F1DetalleTributoItemCantidad,3) +CRLF
	lTXTINFO+= "---------" +CRLF
	lTXTINFO+= CRLF
	
	lResultado:= oFE:F1CAESolicitar()
		
	if lResultado
		lTXTINFO+= "Resultado  mtodo: verdadero" +CRLF
		lTXTINFO+= "resultado global AFIP: " + oFE:F1RespuestaResultado +CRLF
		lTXTINFO+= "fecha del proceso: " + oFE:F1RespuestaFchProceso +CRLF
		lTXTINFO+= "es reproceso? " + oFE:F1RespuestaReProceso +CRLF
		lTXTINFO+= "registros procesados por AFIP: " + Str(oFE:F1RespuestaCantidadReg) +CRLF
		lTXTINFO+= "error genrico global:" + oFE:f1ErrorMsg1 +CRLF
		lTXTINFO+= "---------" +CRLF
		lTXTINFO+= "Ultimo msje error:" + oFE:UltimoMensajeError +CRLF
		lTXTINFO+= "---------" +CRLF
		If oFE:F1RespuestaCantidadReg > 0
			oFE:f1Indice = 0
			lTXTINFO+= "Detalle CAE: " + oFE:F1RespuestaDetalleCae +CRLF
			lTXTINFO+= "        VTO: " + oFE:F1RespuestaDetalleCAEFchVto +CRLF
			lTXTINFO+= "Error item Cantidad: " + str(oFE:f1ErrorItemCantidad,8) +CRLF
		else
			lTXTINFO+= " Codigo error "+ str(oFE:f1ErrorCode1) +CRLF
			lTXTINFO+= " Mensaje "+ oFE:f1ErrorMsg1 +CRLF
			//lTXTINFO+= " Codigo Observacion "+ str(oFE:F1RespuestaDetalleObservacionCode1) +CRLF
			//lTXTINFO+= " Detalle obs "+ oFE:F1RespuestaDetalleObservacionMsg1 +CRLF
		EndIf
	Else
		lTXTINFO+= "Resultado  mtodo: falso !!!" +CRLF
		OPC18X:= 0
	Endif

	lTXTINFO+= "---------" +CRLF
	msginfo( lTXTINFO)
	
	if oFE:F1RespuestaResultado=="A"
		OPC18X:= val(oFE:F1DetalleCbteDesdeS)
		OPCNCAE:= val(oFE:F1RespuestaDetalleCae)
		OPCVCAE:= ctod( subst(oFE:F1RespuestaDetalleCAEFchVto,7,2) +"/"+subst(oFE:F1RespuestaDetalleCAEFchVto,5,2)+"/"+subst(oFE:F1RespuestaDetalleCAEFchVto,1,4) )
	else
		vererrores("SOLICITAR CAE")
		//if "El nmero o fecha del comprobante no se corresponde con el prximo a autorizar"  $ oFE:UltimoMensajeError
		if "mero o fecha del comprobante no se corresponde con el pr"  $ oFE:UltimoMensajeError .and. "ximo a autorizar"  $ oFE:UltimoMensajeError
			CargaNroCAEyVto()  // rutina por si se corta para poder grabar y seguir
			If empty(OPCNCAE) ; OPC18X:= 0 ; EndIf
			//MsgInfo ( Str ( OPCNCAE ) +" "+ DTOC ( OPCVCAE ) )
		else
			OPC18X:= 0
		endif
	endif

else
	msginfo("Fallo al obtener autorizacin "+oFE:ultimoMensajeError) ; OPC18X:= 0
EndIf
	




function CrearObjetoFE_TicketAcceso()
local lResultado:= .F.
oFE:= CreateObject( "WSAFIPFEOCX.WSAFIPFEx" ) 

if empty(lWSAFE)
	lResultado:= oFE:iniciar(0, subst(lCUIT,1,2)+subst(lCUIT,4,8)+subst(lCUIT,13,1), lAPFX, "" )         //  servidor de prueba
else
	lResultado:= oFE:iniciar(1, subst(lCUIT,1,2)+subst(lCUIT,4,8)+subst(lCUIT,13,1), lAPFX, lWSAFE )     //  servidor REAL 
endif

if !lResultado
	while .T.
		if !msgOKCancel("Fallo iniciar "+oFE:ultimoMensajeError  +CRLF+ "Intenta Nuevamente ?")
			exit
		else
			if empty(lWSAFE)
				lResultado:= oFE:iniciar(0, subst(lCUIT,1,2)+subst(lCUIT,4,8)+subst(lCUIT,13,1), lAPFX, "" )         //  servidor de prueba
			else
				lResultado:= oFE:iniciar(1, subst(lCUIT,1,2)+subst(lCUIT,4,8)+subst(lCUIT,13,1), lAPFX, lWSAFE )     //  servidor REAL 
			endif
			if lResultado ; exit ; endif
		endif
	end
endif

if lResultado
	lResultado:= oFE:f1ObtenerTicketAcceso()
	if !lResultado
		while .T.
			if !msgOKCancel("Fallo acceso al obtener autorizacin !!!" +CRLF+ oFE:ultimoMensajeError  +CRLF+ "Intenta Nuevamente ?")
				exit
			else
				lResultado:= oFE:f1ObtenerTicketAcceso()
				if lResultado ; exit ; endif
			endif
		end
	endif
	if lResultado
		oFE:ArchivoXMLEnviado:= ".\AFIP\CAEA_Enviado.xml"
		oFE:ArchivoXMLRecibido:= ".\AFIP\CAEA_Recibido.xml"
	endif
endif
return lResultado

/*   TABLAS   */

function ConsultaTablaMonedas()
local lCNTDOR, lTXT:="", lID, lResultado:= .F.

lResultado:= CrearObjetoFE_TicketAcceso()
if lResultado
	if oFE:f1ParamGetTiposMoneda()
		lTXT:= "TABLA DE MONEDAS " +CRLF +CRLF
		for lCNTDOR:=3 to oFE:f1TiposMonedaItemCantidad - 1
			oFE:f1IndiceItem:= lCNTDOR
			if valtype(oFE:f1TiposMoneda_Id)=="N" ; lID:= str(oFE:f1TiposMoneda_Id,3)
			else ; lID:= oFE:f1TiposMoneda_Id
			endif
			lTXT+= "Id. "+lID +"  Desc. "+oFE:f1TiposMoneda_Desc +"  F.Desde "+oFE:f1TiposMoneda_fchDesde  +"  F.Hasta "+oFE:f1TiposMoneda_fchHasta +CRLF
			//lTXT+= "  Desc. "+oFE:f1TiposMoneda_Desc +"  F.Desde "+oFE:f1TiposMoneda_fchDesde  +"  F.Hasta "+oFE:f1TiposMoneda_fchHasta +CRLF
		next
		Msginfo( lTXT )
	else
		msginfo("fallo al obtener lista de tipos de monedas" + Chr(10) + oFE:UltimoMensajeError)
		VerErrores("TABLA MONEDAS")
	endif
EndIf
return nil
//

function ConsultaTablaIVAS()
local lCNTDOR, lTXT:="", lID, lResultado:= .F.

lResultado:= CrearObjetoFE_TicketAcceso()
if lResultado
	if oFE:f1ParamGetTiposIva()
		lTXT:= "TABLA DE TIPOS DE IVA " +CRLF +CRLF
		for lCNTDOR:=0 to oFE:f1TiposIvaItemCantidad - 1
			oFE:f1IndiceItem:= lCNTDOR
			if valtype(oFE:f1TiposIva_Id)=="N" ; lID:= str(oFE:f1TiposIva_Id,3)
			else ; lID:= oFE:f1TiposIva_Id
			endif
			lTXT+= "Id. "+lID +"    " +padr(oFE:f1TiposIva_Desc,6) +"  F.Desde "+oFE:f1TiposIva_fchDesde  +"  F.Hasta "+oFE:f1TiposIva_fchHasta +CRLF
		next
		Msginfo( lTXT )
	else
		msginfo("fallo al obtener lista de tipos de iva" + Chr(10) + oFE:UltimoMensajeError)
		VerErrores("TABLA TIPOS DE IVA")
	endif
EndIf
return nil
//

function ConsultaTablaDocumentos()
local lCNTDOR, lTXT:="", lID, lResultado:= .F.

lResultado:= CrearObjetoFE_TicketAcceso()
if lResultado
	if oFE:f1ParamGetTiposDoc()
		lTXT:= "TABLA DE TIPOS DE DOCUMENTOS " +CRLF +CRLF
		for lCNTDOR:=0 to oFE:f1TiposDocItemCantidad - 1
			oFE:f1IndiceItem:= lCNTDOR
			if valtype(oFE:f1TiposDoc_Id)=="N" ; lID:= str(oFE:f1TiposDoc_Id,3)
			else ; lID:= oFE:f1TiposDoc_Id
			endif
			lTXT+= "Id. "+lID +"    " +padr(oFE:f1TiposDoc_Desc,20) +"  F.Desde "+oFE:f1TiposDoc_fchDesde  +"  F.Hasta "+oFE:f1TiposDoc_fchHasta +CRLF
		next
		Msginfo( lTXT )
	else
		msginfo("fallo al obtener lista de tipos de documentos" + Chr(10) + oFE:UltimoMensajeError)
		VerErrores("TABLA TIPOS DE DOCUMENTOS")
	endif
EndIf
return nil
//

function ConsultaTablaComprobantes()
local lCNTDOR, lTXT:="", lID, lResultado:= .F.

lResultado:= CrearObjetoFE_TicketAcceso()
if lResultado
	if oFE:f1ParamGetTiposCbte()
		lTXT:= "TABLA DE TIPOS DE COMPROBANTES " +CRLF +CRLF
		for lCNTDOR:=0 to oFE:f1TiposCbteItemCantidad - 1
			oFE:f1IndiceItem:= lCNTDOR
			if valtype(oFE:f1TiposCbte_Id)=="N" ; lID:= str(oFE:f1TiposCbte_Id,3)
			else ; lID:= oFE:f1TiposCbte_Id
			endif
			lTXT+= "Id. "+lID +"    " +padr(oFE:f1TiposCbte_Desc,20) +"  F.Desde "+oFE:f1TiposCbte_fchDesde  +"  F.Hasta "+oFE:f1TiposCbte_fchHasta +CRLF
		next
		Msginfo( lTXT )
	else
		msginfo("fallo al obtener lista de tipos de comprobantes" + Chr(10) + oFE:UltimoMensajeError)
		VerErrores("TABLA TIPOS COMPROBANTES")
	endif
EndIf
return nil
//
function ConsultaPtoVtas()
local lCNTDOR, lTXT:="", lID, lResultado:= .F.

lResultado:= CrearObjetoFE_TicketAcceso()
if lResultado
	if oFE:f1ParamGetPtosVenta()
		lTXT:= "PUNTOS DE VENTA HABILITADOS " +CRLF +CRLF
		for lCNTDOR:=0 to oFE:f1PtosVentaItemCantidad - 1
			oFE:f1IndiceItem:= lCNTDOR
			if valtype(oFE:f1PtosVenta_nro)=="N" ; lID:= str(oFE:f1PtosVenta_nro,4)
			else ; lID:= oFE:f1PtosVenta_nro
			endif
			lTXT+= "Id. "+lID +"    " +padr(oFE:f1PtosVenta_EmisisionTipo,30) +"  Bloqueado "+oFE:f1PtosVenta_Bloqueado  +"  F.Baja "+oFE:f1PtosVenta_fchBaja +CRLF
		next
		Msginfo( lTXT )
	else
		msginfo("fallo al obtener lista de puntos de venta" + Chr(10) + oFE:UltimoMensajeError)
		VerErrores("PUNTOS DE VENTAS")
	endif
EndIf
return nil
//